package org.algorithm.YaYa.链表;

import org.algorithm.biubiu.wheel_1.common.ListNode;

/***
 *
 *  和为0 包括但不限定：    正整数之间想减和为0， 正负相加和为0
 *
 * 参考地址： https://leetcode-cn.com/problems/remove-zero-sum-consecutive-nodes-from-linked-list/
 */
public class 删除和为0的连续节点 {
    public static void main(String[] args){
        ListNode node = ListNode.build(1,2,3,-3,4);
        System.out.println(removeZeroSumSublists(node));
    }


    public static ListNode removeZeroSumSublists(ListNode head) {
        //先处理特殊情况
        if(head.next == null){
            if(head.val == 0) return null;
            else return head;
        }
        //生成带头结点的链表
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode h = dummyHead;
        boolean flag = true;

        while(h.next != null){
            flag = true;     //要记得每一次循环都要将flag恢复默认值
            ListNode p = h.next;
            //当p节点为0时直接进行删除操作，同理删除操作后不需要进行h的后移，
            //但这里可以用continue语句代替flag的控制作用
            if(p.val == 0){
                h.next = p.next;
                continue;
            }
            ListNode q = p.next;
            int sum = p.val;    //sum是p至q的总和
            while(q != null){
                sum += q.val;
                //flag的控制作用体现在这里，要加上break使用
                if(sum == 0){
                    h.next = q.next;
                    flag = false;
                    break;
                }
                else q = q.next;
            }
            //flag控制
            if(flag) h = h.next;
        }
        return dummyHead.next;
    }
}
